package ar.com.seminario.controller;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import ar.com.seminario.common.service.exception.ServiceException;
import ar.com.seminario.common.util.ConexiaDateUtil;
import ar.com.seminario.dto.CandidatoDto;
import ar.com.seminario.dto.EntrevistaDto;
import ar.com.seminario.dto.SolicitudIngresoDto;
import ar.com.seminario.model.Candidato;
import ar.com.seminario.model.Perfil;
import ar.com.seminario.model.SolicitudIngreso;
import ar.com.seminario.service.ICandidatoService;
import ar.com.seminario.service.IPerfilService;
import ar.com.seminario.service.ISolicitudIngresoService;
import ar.com.seminario.systema.model.TipoUsuario;
import ar.com.seminario.systema.model.Usuario;

/**
 * Controller para el manejo de busquedas.
 * 
 * @author Pablo Lamas
 * 
 */
@Controller
public class PostulantesController extends GenericController {

	/**
	 * Logger del controller.
	 */
	private static final Logger LOG = LoggerFactory.getLogger(PostulantesController.class);

	/**
	 * Servicio de acceso a {@link Candidato}.
	 */
	@Autowired
	private ICandidatoService candidatoService;
	
	/**
	 * Servicio de acceso a {@link SolicitudIngreso}.
	 */
	@Autowired
	private ISolicitudIngresoService solicitudIngresoService;
	
	/**
	 * Servicio de acceso a {@link Perfil}.
	 */
	@Autowired
	private IPerfilService perfilService;

	/**
	 * Despliega la pantalla de administrar postulantes.
	 * 
	 */
	@RequestMapping(value = "/administrarPostulantes", method = RequestMethod.GET)
	public final ModelAndView getPageAdministrarPostulantes(final ModelMap model, HttpServletRequest request) {

		try {

			this.getStartModel(model, request);
			model.put("postulantes", this.candidatoService.getAllCandidatosDto());

		} catch (final Exception e) {
			PostulantesController.LOG.error("Error creando el Dto de datos del paciente.");
		}

		return (new ModelAndView("administrar-postulantes", model));

	}

	/**
	 * Despliega la pantalla de consulta de datos de la solicitud de ingreso.
	 * 
	 */
	@RequestMapping(value = "/crearPostulante", method = RequestMethod.POST)
	public final ModelAndView getPageCrearPostulante(ModelMap model, HttpServletRequest request, Long idSolicitud) {

		return (new ModelAndView("crear-postulante", model));

	}

	/**
	 * Ejecuta la accion de registracion en la base de datos de un nuevo
	 * postulante.
	 * 
	 */
	@RequestMapping(value = "/savePostulante", method = RequestMethod.POST)
	@ResponseBody
	public final String savePostulante(@ModelAttribute("CandidatoDto") CandidatoDto candidatoDto, ModelMap model,
			HttpServletRequest request) {

		String respuesta = new String("");

		try {

			this.candidatoService.saveCandidato(candidatoDto);
			respuesta = this.armarRespuesta(true, "El postulante fue guardado con exito");

		} catch (ServiceException e) {
			respuesta = this.armarRespuesta(false, "");
		}

		return respuesta;
	}

	/**
	 * Despliega la pantalla de consulta de datos de la solicitud de ingreso.
	 * 
	 */
	@RequestMapping(value = "/editarPostulante", method = RequestMethod.POST)
	public final ModelAndView getPageEditarPostulante(ModelMap model, HttpServletRequest request, Long idPostulante) {

		model.put("candidato", this.candidatoService.getCandidatoDtoPorId(idPostulante));
		return (new ModelAndView("editar-postulante", model));

	}

	/**
	 * Ejecuta la accion de actualizar en la base de datos de un postulante.
	 * 
	 */
	@RequestMapping(value = "/updatePostulante", method = RequestMethod.POST)
	@ResponseBody
	public final String updatePostulante(@ModelAttribute("CandidatoDto") CandidatoDto candidatoDto, ModelMap model,
			HttpServletRequest request) {

		String respuesta = new String("");

		try {

			this.candidatoService.saveCandidato(candidatoDto);
			respuesta = this.armarRespuesta(true, "El postulante fue actualizado con exito");

		} catch (ServiceException e) {
			respuesta = this.armarRespuesta(false, "");
		}

		return respuesta;
	}

	/**
	 * Despliega la pantalla de consulta de datos de la solicitud de ingreso.
	 * 
	 */
	@RequestMapping(value = "/asociarPostulante", method = RequestMethod.POST)
	public final ModelAndView getPageAsociarPostulanteNuevo(ModelMap model, HttpServletRequest request,
			Long idPostulante, Long idSolicitudIngreso) {

		model.put("idSolicitudIngreso", idSolicitudIngreso);
		return (new ModelAndView("editar-postulante", model));

	}

	/**
	 * Ejecuta la accion de asociar un nuevo postulante a una solicitud de
	 * ingreso.
	 * 
	 */
	@RequestMapping(value = "/asociarPostulanteNuevo", method = RequestMethod.POST)
	@ResponseBody
	public final String asociarPostulanteNuevo(@ModelAttribute("CandidatoDto") CandidatoDto candidatoDto,
			ModelMap model, HttpServletRequest request) {

		String respuesta = new String("");

		try {

			this.candidatoService.asociarPostulanteNuevo(candidatoDto);
			respuesta = this.armarRespuesta(true, "El postulante fue actualizado con exito");

		} catch (ServiceException e) {
			respuesta = this.armarRespuesta(false, "");
		}

		return respuesta;
	}
	
	/**
	 * Despliega la pantalla para editar un postulante, y cargar sus respectivas entrevistas.
	 * 
	 */
	@RequestMapping(value = "/editarPostulanteEntrevistado", method = RequestMethod.POST)
	public final ModelAndView getPageAdministrarPostulante(ModelMap model, HttpServletRequest request,
			Long idPostulante, Long idSolicitudIngreso) {

		try {
			
			this.getStartModel(model, request);
			model.put("idSolicitudIngreso", idSolicitudIngreso);
			model.put("idPostulante", idPostulante);
			
			//Obtengo el postulante
			CandidatoDto candidatoDto = this.candidatoService.getCandidatoDtoPorId(idPostulante);
			model.put("candidato", candidatoDto);
			
			//Obtengo la solicitud
			SolicitudIngresoDto solicitudDto = this.solicitudIngresoService.getSolicitudDtoPorId(idSolicitudIngreso);
			model.put("puestoRequerido",solicitudDto.getPerfilNombre());
			model.put("gerenteSolicitante",solicitudDto.getGerenteSolicitante());
			
			//Controlo dependiendo el perfil del usuario que solapa debo mostrar.
			HttpSession session = request.getSession();
			Usuario usuario = (Usuario) session.getAttribute("usuarioEnSession"); 
			
			
			if(usuario.getTipoUsuario().equals(TipoUsuario.ANALISTA_RRHH)){
				
				//Si se realizo la entrevista de RRHH entonces bloqueo la pantalla.
				if(this.cantidadEntrevistasCandidato(solicitudDto.getEntrevistas(), idPostulante)>0){
					model.put("bloquearSolapa1", 1);
				}else{
					model.put("bloquearSolapa1", 0);
				}
				
				model.put("bloquearSolapa2", 1);
				model.put("bloquearSolapa3", 1);
				
			}else if(usuario.getTipoUsuario().equals(TipoUsuario.COLABORADOR) || 
					usuario.getTipoUsuario().equals(TipoUsuario.AUDITOR)){
				
				model.put("bloquearSolapa1", 1);
				if(this.cantidadEntrevistasCandidato(solicitudDto.getEntrevistas(), idPostulante)==0){
					model.put("bloquearSolapa2", 1);
					model.put("bloquearSolapa3", 1);
				}else if(this.cantidadEntrevistasCandidato(solicitudDto.getEntrevistas(), idPostulante)==1){
					model.put("bloquearSolapa2", 0);
					model.put("bloquearSolapa3", 1);
				}else{
					model.put("bloquearSolapa2", 1);
					model.put("bloquearSolapa3", 0);
				}
				
				//Armo la lista con los skill a puntear.
				Perfil  perfil = this.perfilService.getPerfilById(solicitudDto.getPerfilId());
				model.put("detallesPerfil", perfil.getAllDetallesPerfil());
			}
			
			model.put("fechaActual", ConexiaDateUtil.getDateFormateada(new Date()));
			model.put("evaluador", usuario.getNombre()+" "+usuario.getApellido());
			
		} catch (Exception e) {
			PostulantesController.LOG.error("Error creando el Dto de datos del postulante.");
		}
		
		return (new ModelAndView("editar-postulante-entrevistado", model));

	}

	
	private int cantidadEntrevistasCandidato(List<EntrevistaDto> entrevistas,
			Long idPostulante) {
		
		Integer cantidadEntrevistas = 0;
		
		for (EntrevistaDto entrevistaDto : entrevistas) {
			if(entrevistaDto.getCandidatoId().equals(idPostulante))
				cantidadEntrevistas++;	
		}
		
		return cantidadEntrevistas;
	}

}
